/**
 * @file util.hpp
 *
 * @date 17/12/2011
 * @author Tales 
 *
 */

#ifndef _COMMON_UTIL_HPP_
#define _COMMON_UTIL_HPP_

#include <utility>

namespace yep
{
using namespace std;

/**
 * @brief Transforma uma definição ordinária de Retângulo em um Retângulo normalizado
 *
 * Um Retângulo normalizado têm a seguinte propriedade:
 * @code
 * R.first.first <= R.second.first && R.first.second <= R.second.second;
 * @endcode
 *
 * @param p1
 * @param p2
 * @return
 */
inline pair<pair<int, int> , pair<int, int> > normalizeRect(pair<int, int> p1, pair<int, int> p2)
{
	return make_pair(make_pair(min(p1.first, p2.first), min(p1.second, p2.second)),
			make_pair(max(p1.first, p2.first), max(p1.second, p2.second)));
}

inline SDL_Rect toSDL_Rect(pair<int, int> p1, pair<int, int> p2)
{
	auto norm = normalizeRect(p1, p2);

	pair<int, int> n1 = norm.first, n2 = norm.second;

	return (SDL_Rect)
	{	(Sint16)n1.first, (Sint16)n1.second, (Uint16)(n2.first-n1.first+1), (Uint16)(n2.second-n1.second+1)};
}

template<class T>
inline pair<pair<int, int> , pair<int, int> > largestRect(const T &first, const T &last)
{
	if(first == last)
		return make_pair(make_pair(0,0), make_pair(0,0));
	T it = first;
	pair<int, int> smaller = *it, bigger = *it;
	while( (++it) != last)
	{
		if (it->first < smaller.first) {
			smaller.first = it->first;
		}
		if (it->second < smaller.second) {
			smaller.second = it->second;
		}
		if (it->first > bigger.first) {
			bigger.first = it->first;
		}
		if (it->second > bigger.second) {
			bigger.second = it->second;
		}
	}
	return make_pair(smaller, bigger);
}

template<class T>
inline SDL_Rect largestSDL_Rect(const T &first, const T &last)
{
	auto temp = largestRect(first, last);
	return toSDL_Rect(temp.first, temp.second);
}

} // namespace yep

#endif /* _COMMON_UTIL_HPP_ */
